home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 July / EnigmA AMIGA RUN 29 (1998)(G.R. Edizioni)(IT)[!][issue 1998-07 & 08].iso / earcd / phase5 / ppcrelease / examples / startup.c < prev    next >
C/C++ Source or Header  |  1998-02-21  |  4KB  |  146 lines

  1. /* Stefan Burstrom Source and concept
  2.  * Adapted by Ralph Schmidt
  3.  */
  4.  
  5. #include <exec/types.h>
  6. #include <exec/nodes.h>
  7. #include <exec/lists.h>
  8. #include <exec/memory.h>
  9. #include <utility/tagitem.h>
  10. #include <powerup/ppclib/interface.h>
  11. #include <powerup/ppclib/message.h>
  12. #include <powerup/ppclib/tasks.h>
  13. #include <powerup/proto/ppc.h>
  14. #include <proto/exec.h>
  15. #include <proto/dos.h>
  16.  
  17. struct StartupData
  18. {
  19.     APTR    M68kPort; /* The PPCTask can send messages here */
  20.     LONG    Status;   /* When the task exits, it can fill in the status here */
  21. };
  22.  
  23. #define    MSG_END    0x12345678
  24.  
  25. void main(int    argc,
  26.           char    *argv[])
  27. {
  28. struct TagItem    MyTags[10];
  29. struct Library    *PPCLibBase;
  30. void        *MyObject;
  31. ULONG        MsgID;
  32.  
  33.  
  34.   if (PPCLibBase=OpenLibrary("ppc.library",44))
  35.   {
  36.     if (MyObject=PPCLoadObject("PROGDIR:StartupPPC.elf"))
  37.     {
  38.       APTR M68kPort;
  39.  
  40.       MyTags[0].ti_Tag  = TAG_DONE;
  41.             
  42.       if (M68kPort = PPCCreatePort(MyTags))
  43.       {
  44.         APTR PPCMsg;
  45.         if (PPCMsg = PPCCreateMessage(M68kPort,sizeof(struct StartupData)))
  46.         {
  47.           struct StartupData    *StartupData;
  48.       
  49.           if (StartupData = PPCAllocVec(sizeof(struct StartupData),MEMF_ANY))
  50.           {
  51.             long    quit = FALSE;
  52.             APTR    Task;
  53.  
  54.             StartupData->M68kPort    =    M68kPort; /* Provide the PPC a way to send us messages */
  55.  
  56.             MyTags[0].ti_Tag        =    PPCTASKTAG_STARTUP_MSG;
  57.             MyTags[0].ti_Data        =(ULONG) PPCMsg;
  58.  
  59.             MyTags[1].ti_Tag        =    PPCTASKTAG_STARTUP_MSGDATA;
  60.             MyTags[1].ti_Data        =(ULONG) StartupData;
  61.  
  62.             MyTags[2].ti_Tag        =    PPCTASKTAG_STARTUP_MSGLENGTH;
  63.             MyTags[2].ti_Data        =    sizeof(struct StartupData);
  64.  
  65.             MyTags[3].ti_Tag        =    PPCTASKTAG_STARTUP_MSGID;
  66.             MyTags[3].ti_Data        =    MSG_END;
  67.  
  68.             MyTags[4].ti_Tag        =    PPCTASKTAG_MSGPORT;
  69.             MyTags[4].ti_Data        =    TRUE;
  70.  
  71.             MyTags[5].ti_Tag        =    TAG_END;
  72.  
  73.  
  74.             if (Task = PPCCreateTask(MyObject,
  75.                                      MyTags))
  76.             {
  77.               while (!quit)
  78.               {
  79.                 APTR    thePPCMsg;
  80.  
  81.  
  82.                 PPCWaitPort(M68kPort);
  83.  
  84.                 if (thePPCMsg = PPCGetMessage(M68kPort))
  85.                 {
  86.                   MsgID    =    PPCGetMessageAttr(thePPCMsg, PPCMSGTAG_MSGID);
  87.                   switch (MsgID)
  88.                   {
  89.                     case MSG_END:
  90.                             /* Handle our reply messages here */
  91.                             /* Since the only message we send is the
  92.                              * startup msg, we quite in all cases    */
  93.                             /* Here we check the return code from the PPC task
  94.                              * We could be abit more sofisticated and display
  95.                              * appropriate message, take actions etc.
  96.                              */
  97.                             Printf("Status from PPCTask: %ld\n",StartupData->Status);
  98.                             quit    =    TRUE;
  99.                             break;
  100.  
  101.                     default:
  102.                             /* Handle our messages here */
  103.                             /* We should probably do something more interesting here */
  104.                             Printf("The message ID was: %ld\n",PPCGetMessageAttr(thePPCMsg, PPCMSGTAG_MSGID));
  105.                             PPCReplyMessage(thePPCMsg);
  106.                             break;
  107.                   }
  108.                 }
  109.               }
  110.             }
  111.             else
  112.             {
  113.               Printf("Unable to create PPC task\n");
  114.             }
  115.             PPCFreeVec(StartupData);
  116.           }
  117.           else
  118.           {
  119.             Printf("Unable to allocate Startup Message\n");
  120.           }
  121.           PPCDeleteMessage(PPCMsg);
  122.         }
  123.         else
  124.         {
  125.           Printf("Unable to create PPC Message\n");
  126.         }
  127.         PPCDeletePort(M68kPort);
  128.       }
  129.       else
  130.       {
  131.         Printf("ERROR: Unable to allocate memory\n");
  132.       }
  133.       PPCUnLoadObject(MyObject);
  134.     }
  135.     else
  136.     {
  137.       Printf("ERROR: Couldn't load PPC Program (PPCMpeg.elf)\n");
  138.     }
  139.     CloseLibrary(PPCLibBase);
  140.   }
  141.   else
  142.   {
  143.     Printf("ERROR: Couldn't open ppc.library\n");
  144.   }
  145. }
  146.